<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>

    /* 

    1. 变量到底是什么?
      可以变化的量(数据), 由变量名和变量值组成, 变量值就是数据, 变量名是数据的变量的标识名称
      一个变量对应一块小内存, 数据就保存在这个内存中, 变量名就是内存的标识, 通过变量名就可以找到这块内存, 进而操作(读/写)其中的数据
    2. 基本类型变量与引用类型变量的区别是什么?
      分类的依据是: 变量内存中保存的是地址值数据还是基本类型数据
      基本类型变量: 变量内存保存的就是基本类型数据
      引用类型变量: 变量内存中保存的就是地址值数据
    3. 函数传参, 到底是值传递还是引用传递?  
      理解为值传递: 传递的是b内存中的数据/值
      理解为引用传递: b内存中的数据是地址值数据, 传递的是一个地址值(引用)  
    4. 给变量赋值到底做了什么?
      将右侧变量内存中的数据(基本/地址)拷贝一份保存到左边变量内存中
    5. 有哪些改变变量值的方式?
      重新赋值
      c.m = 2 没有改变c变量内存, 改变的是c指向对象内存中的属性数据
    6. 如何理解下面2句重要的话(编码演示说明)?
      - 2个引用变量指向同一个对象, 如果通过一个变量修改对象内部的数据 => 另一个变量也能看到原对象(新数据)
      - 2个引用变量指向同一个对象, 让其中一个变量指向一个新的对象 => 另一个引用变量看到的是老的对象
  */

    var a = 3
    var b = {m: 1}

    function fn(c) {
      
    }
    fn(a)   // c = a  拷贝a内存中数据3, 保存c内存中   => 值传递
    fn(b) // c = b 拷贝b内存中的数据(地址值), , 保存c内存中
      // 理解为值传递: 传递的是b内存中的数据/值
      // 理解为引用传递: b内存中的数据是地址值数据, 传递的是一个地址值(引用)


    var c = 4
    c = []
    // 将右侧变量内存中的数据(基本/地址)拷贝一份保存到左边变量内存中
    c = a
    c = b
    c.m = 2

    /* 
    - 2个引用变量指向同一个对象, 如果通过一个变量修改对象内部的数据 => 另一个变量也能看到原对象(新数据)
    - 2个引用变量指向同一个对象, 让其中一个变量指向一个新的对象 => 另一个引用变量看到的是老的对象
    */
    var o1 = {m: 1}
    var o2 = o1

    // 如果通过一个变量修改对象内部的数据 => 另一个变量也能看到原对象(新数据)
    // o1.m = 2   // {m: 2}
    // console.log(o2.m) // 2     

    // 让其中一个变量指向一个新的对象 => 另一个引用变量看到的是老的对象
    // o2 = {m: 3}
    // console.log(o1.m) // 2

    function fn2(o1) {
      // o1 = {m: 2}
      o1.m = 3
    }

    fn2(o1)
    console.log(o1.m, o2.m) // 1 1

  </script>
</body>
</html>